package com.bigdata.mapreduce;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

import java.io.IOException;

/**
 * keyin: 行号 是 LongWritable 不是 IntWritable
 * IntWritable implements WritableComparable: 有序列化和排序的能力
 * valuein: 一行的数据
 * 要数据单词，单词出现的次数
 */
public class WordMapper extends Mapper<LongWritable, Text, Text, IntWritable> {

    // 引用类型，传递到方法中的是 地址值
    private Text mkey = new Text();
    private IntWritable mval = new IntWritable(1);

    // 重写和重载的区别
    @Override
    protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, IntWritable>.Context context) throws IOException, InterruptedException {
        // 拿到一行的数据，切分出word，映射为 (word,1), 写出环形缓冲区
        // 计算分区、环形缓冲区的排序、merge、shuffle 这些流程是MR内部完成，不需要写对应的代码
//        hello hadoop
        String line = value.toString();
        String[] words = line.split(" ");

        for (String word : words) {
            // 会频繁的创建对象，不好，提到属性上会更好溢写，因为有序列化和反序列化，放在属性上，最终的结果是没问题的
//            Text mkey = new Text(word);
//            IntWritable mval = new IntWritable(1);
            /*
            hello 1
            hello 1
            word 1
            hadoop 1
             */
            mkey.set(word);
            System.out.println("mkey:" + mkey.toString() + ", mval:" + mval.get());
            // write 方法中调用序列化的操作
            context.write(mkey, mval);
        }

    }
}